home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / brklyprl.lha / Comp / assn_elim.pl next >
Text File  |  1989-04-14  |  3KB  |  96 lines

  1.  
  2. /* Copyright (C) 1988, 1989 Herve' Touati, Aquarius Project, UC Berkeley */
  3.  
  4. /* Copyright Herve' Touati, Aquarius Project, UC Berkeley */
  5.  
  6. % eliminate redundant assignments
  7. % We can remove a put_value Yj,Xi when:
  8. %   1) it's before the first call, and
  9. %   2) Yj was initialized by a get_variable, and
  10. %   3) between the get_variable and the put_value, there's no get, put, or
  11. %    unify instruction which references Xi.  (This is probably overkill,
  12. %    but it is correct.)
  13. % The purpose of this optimization is to fix code for clauses like:
  14. %    a(X) :- b(X), x(X).
  15. % which generates:
  16. %    get_variable Y1,X1
  17. %    put_value Y1,X1        < redundant instruction >
  18. %    call b/1
  19. %        -- Wayne (1/28)
  20.  
  21. assn_elim(Code, ACode) :-
  22.     assn_elim(Code, ACode,live(no,no,no,no,no,no,no)).
  23.  
  24. assn_elim([I|Rest], [I|Rest],_) :- 
  25.     I = call(_,_), !.
  26. assn_elim([], [], _) :- !.
  27. assn_elim([get(variable,Y,R)|Rest], 
  28.       [get(variable,Y,R)|NewRest],
  29.       Live) :-
  30.     nonvar(Y), 
  31.     Y=y(J),  
  32.     R=x(I), nonvar(I), I\==8, !,
  33.     make_live(Live,I,J,NewLive),
  34.     assn_elim(Rest,NewRest,NewLive).
  35. assn_elim([put(value,Y,R)|Rest],
  36.       NewRest,
  37.       Live) :-
  38.     nonvar(Y), Y=y(J), R=x(I), nonvar(I), is_live(Live,I,J), !,
  39.     assn_elim(Rest,NewRest,Live).
  40. assn_elim([I|Rest], [I|NewRest], Live) :-
  41.     (I=put(A,X,Y); I=get(A,X,Y); I=unify(A,X)),
  42.     (nonvar(X), X=x(K), nonvar(K) ->
  43.         make_dead(Live,K,NewLive);
  44.         NewLive = Live),
  45.     (nonvar(Y), Y=x(J), nonvar(J) ->
  46.         make_dead(NewLive,J,NewLive2);
  47.         NewLive2=NewLive), !,
  48.     assn_elim(Rest,NewRest,NewLive2).
  49. assn_elim([I|Rest], [I|NewRest], Live) :-
  50.     assn_elim(Rest,NewRest,Live).
  51.  
  52. % Live structure has exactly seven elements.
  53. make_live(live(A1,A2,A3,A4,A5,A6,A7),1,J,
  54.       live(J,A2,A3,A4,A5,A6,A7)).
  55.  
  56. make_live(live(A1,A2,A3,A4,A5,A6,A7),2,J,
  57.       live(A1,J,A3,A4,A5,A6,A7)).
  58.  
  59. make_live(live(A1,A2,A3,A4,A5,A6,A7),3,J,
  60.       live(A1,A2,J,A4,A5,A6,A7)).
  61.  
  62. make_live(live(A1,A2,A3,A4,A5,A6,A7),4,J,
  63.       live(A1,A2,A3,J,A5,A6,A7)).
  64.  
  65. make_live(live(A1,A2,A3,A4,A5,A6,A7),5,J,
  66.       live(A1,A2,A3,A4,J,A6,A7)).
  67.  
  68. make_live(live(A1,A2,A3,A4,A5,A6,A7),6,J,
  69.       live(A1,A2,A3,A4,A5,J,A7)).
  70.  
  71. make_live(live(A1,A2,A3,A4,A5,A6,A7),7,J,
  72.       live(A1,A2,A3,A4,A5,A6,J)).
  73.  
  74. make_dead(live(A1,A2,A3,A4,A5,A6,A7),1,
  75.       live(no,A2,A3,A4,A5,A6,A7)).
  76.  
  77. make_dead(live(A1,A2,A3,A4,A5,A6,A7),2,
  78.       live(A1,no,A3,A4,A5,A6,A7)).
  79.  
  80. make_dead(live(A1,A2,A3,A4,A5,A6,A7),3,
  81.       live(A1,A2,no,A4,A5,A6,A7)).
  82.  
  83. make_dead(live(A1,A2,A3,A4,A5,A6,A7),4,
  84.       live(A1,A2,A3,no,A5,A6,A7)).
  85.  
  86. make_dead(live(A1,A2,A3,A4,A5,A6,A7),5,
  87.       live(A1,A2,A3,A4,no,A6,A7)).
  88.  
  89. make_dead(live(A1,A2,A3,A4,A5,A6,A7),6,
  90.       live(A1,A2,A3,A4,A5,no,A7)).
  91.  
  92. make_dead(live(A1,A2,A3,A4,A5,A6,A7),7,
  93.       live(A1,A2,A3,A4,A5,A6,no)).
  94.  
  95. is_live(Live,I,J) :- arg(I,Live,J).
  96.